package dao;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import bean.*;

/**
 * Classe Responsavel pela Persistencia de Dados do Bolao
 * @author Claudio Cardoso, Daniel Leite, Lucas Sampaio, Matheus Sampaio
 * @version 1.0
 */

public class BolaoDao {

	Bolao bolao;

	//construtor
	public BolaoDao(Bolao bolao) {
		this.bolao = bolao;
	}

	/**
	 * Adiciona algum Objeto (Jogador, Grupo ou Rodada) ao Bolao
	 * @param obj
	 * 		Objeto a ser adicionado no Bolao
	 */
	public void adiciona(Object obj) {		//Perceba que aqui ha uma sobrecarga de metodos. Sempre chamamos adiciona() com um parametro
		adiciona(obj, null);				//o que me garante que este metodo seja chamado. No escorpo dele, ele chama o metodo adiciona()
	}										//com dois parametros(metodo abaixo). Sendo um deles null

	
	/**
	 * Adiciona um Objeto (Jogador, Grupo, Rodada ou Palpite) ao Bolao
	 * @param obj1
	 * 		Objeto a ser adicionado no Bolao
	 * @param obj2
	 * 		Jogo a ser adicionado no Bolao.
	 * 		O objeto so e declarado quando tentarmos adicionar um Palpite ao Bolao. Para adicionar um Palpite, alem
	 * do palpite e necessario um Jogo. 
	 */
	public void adiciona(Object obj1, Object obj2) {
		if (obj1 instanceof Jogador) {					//Esse segundo parametro so sera utilizado quando for necessario
			Jogador jogador = (Jogador) obj1;			//adicionar um Palpite ao Bolao. Isto porque quando adiciono um palpite
			bolao.getJogadores().add(jogador);			//tambem e necessario passar a referencia do jogo. Este e unico caso em que 
														//este metodo sera chamado direto
		} else if (obj1 instanceof Grupo) {
			Grupo grupo = (Grupo) obj1;					//Quando adiciono outros Objetos, como Jogador, Grupo e Rodadam so passo eles
			bolao.getGrupos().add(grupo);				//como parametro. O metodo acima e chamado que redireciona a este passando null
														//como segundo parametro
		} else if (obj1 instanceof Rodada) {			
			Rodada rodada = (Rodada) obj1;				
			rodada.setIdentificador(bolao.getRodadas().size() + 1);
			bolao.getRodadas().add(rodada);
			
		} else if (obj1 instanceof Palpite) {
			Palpite palpite = (Palpite) obj1;
			Jogo jogo = (Jogo) obj2;
			jogo.addPalpite(palpite);
		}
		
		gravaDados();
	}
	
	
	/**
	 * Remove algum Objeto (Jogador, Grupo ou Rodada) do Bolao 
	 * @param obj
	 * 		Objeto a ser removido no Bolao
	 */
	public void remove(Object obj) {
		if (obj instanceof Jogador) {
			Jogador jogador = (Jogador) obj;
			bolao.getJogadores().remove(jogador);
		} else if (obj instanceof Grupo) {
			Grupo grupo = (Grupo) obj;
			bolao.getGrupos().remove(grupo);
		} else if (obj instanceof Rodada) {
			Rodada rodada = (Rodada) obj;
			bolao.getRodadas().remove(rodada);
		}
		
		gravaDados();		//Depois que remove, chama gravaDados(). De certa forma ele atualiza os Dados
	}
	
	/**
	 * Atualiza os Dados do Bolao: Jogadores, Grupos, Palpites...
	 */
	public void atualizaDados() {
		gravaDados();
	}
	
	/**
	 * Grava Dados do Bolao
	 */
	private void gravaDados(){
		
		try{
			ObjectOutputStream fluxoSaida = new ObjectOutputStream(new FileOutputStream("Bolao.dat"));
			
			fluxoSaida.writeObject(bolao);
			fluxoSaida.close();
		} catch(Exception e) {
			System.out.println("Erro no Arquivo. " + e.getMessage());
		}
	}
	
	/**
	 * Ler Dados do Bolao
	 * @return
	 * 		Dados do Bolao
	 */
	public static Bolao lerDados() {
		
		FileInputStream arquivoEntrada;
		
		try{
			arquivoEntrada = new FileInputStream("Bolao.dat");
		}catch(FileNotFoundException e){
			return null;
		}
		
		ObjectInputStream fluxoEntrada = null;
		try {
			fluxoEntrada = new ObjectInputStream(arquivoEntrada);
		} catch (IOException e1) {
			System.err.println("Voce nao tem permissao para ler o arquivo.");
			System.exit(1);
		}
		Bolao bolao2 = null;
		
		try {
			 bolao2 = (Bolao) fluxoEntrada.readObject();
		} catch (IOException e) {
			System.err.println("Erro em ler o arquivo.");
			System.exit(1);
		} catch (ClassNotFoundException e) {
			System.err.println("Leitura do arquivo falhou.");
			System.exit(1);
		}
		
		return bolao2;
	}

}
